// 目标：面向抽象进行coding，而不是面向实现进行代码书写，特别是内部的是变量或者中间方法

// sprint
// 需求
// 分享功能
class Store {
    constructor() {
        this.share = new Share()
    }
}

class Share {
    shareTo() {
        // 分享到不同的平台
    }
}

const store = new Store()
store.share.shareTo('wx')

// sprint2
// 评分功能
class Store {
    constructor() {
        this.share = new Share()
        this.rate = new Rate()
    }
}

class Share {
    shareTo() {
        // 分享到不同的平台
    }
}

class Rate {
    star() {
        // 打分机制
    }
}

// 重构
// 目标：动态挂载 => 暴露挂载
class Store {
    // 当前的模块名单
    static modules = new Map()
    // 支持外部进行注册
    static inject(module) {
        Store.modules.set(module.constructor.name, module)
    }

    constructor() {
        // 遍历名单做初始化挂载
        for(let module of Store.modules.value()) {
            // 每个模块进行初始化
            module.init(this)
        }
    }
}

class Share {
    init(store) {
        store.share = this
    }
    shareTo() {
        // 分享到不同的平台
    }
}

class Rate {
    init(store) {
        store.rate = this
    }
    star() {
        // 打分机制
    }
}

const rate = new Rate()
Store.inject(rate)

const store2 = new Store()
store2.rate.star(5)
